package com.xavier.utils;

import cn.hutool.core.util.ObjectUtil;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class TreeUtil {

    /**
     * 将列表转换为树形结构。
     *
     * @param nodes 包含树节点的列表
     * @param <T>   节点类型
     * @return 根节点的列表（可能有多个根节点）
     */
    public static <T> List<T> listToTree(List<T> nodes) throws Exception {
        if (ObjectUtil.isEmpty(nodes)) {
            return null;
        }
        Class<?> aClass = nodes.get(0).getClass();
        Field privateField = aClass.getDeclaredField("id");
        privateField.setAccessible(true);
        Map<Long, T> idNodeMap = new HashMap<>();
        for (T node : nodes) {
            idNodeMap.put((Long) privateField.get(node), node);
        }
        Field parentIdField = aClass.getDeclaredField("parentId");
        parentIdField.setAccessible(true);
        Field childrenField = aClass.getDeclaredField("children");
        childrenField.setAccessible(true);

        // 遍历节点列表，构建树形结构  
        List<T> treeRoots = new ArrayList<>();
        for (T node : nodes) {
            Long parentId = (Long) parentIdField.get(node);
            if (ObjectUtil.isEmpty(parentId)) {
                treeRoots.add(node);
            } else {
                T parentNode = idNodeMap.get(parentId);
                if (parentNode != null) {
                    aClass.getDeclaredMethod("addChildren", aClass).invoke(parentNode, node);
                }
            }
        }

        return treeRoots;
    }
}